<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <script>
    // 写在原型中的方法可以被所有的实例共享, 实例化的时候不会在实例内存中再复制一份,占有的内存消耗少

    class People {
      /*-- 成员变量 --*/
      name = "man"
      age = 19

      /*-- 成员方法 --*/
      hello = function () {
        console.log("hello, my name is " + this.name)
      }


      /* 构造函数也是原型方法 */
      constructor(name, age) {
        this.name = name
        this.age = age
      }

      /*-- 原型方法 --*/
      eat() {
        console.log("i like 吃饭")
      }
    }

    // 1.创建的对象本身拥有类上面所有的成员变量和成员方法,不具备原型方法
    const people = new People("wang", 66)

    // 2.class People在定义时候,也会隐式新增一个prototype属性  ---> People.prototype 叫做原型对象,原型对象属于类(构造函数)
    // 3.创建的对象将隐式新增一个__proto__属性, 该属性指向一个对象,该对象拥有类的原型方法. 该对象指向类.prototype.所有用该类new出来的对象拥有同一份__proto__
    console.log(people.__proto__ === People.prototype)   // true

    // 4.无论是[类.prototype] 还是[对象.__proto__] 他们只是在创建的时候是特殊的, 在类或者对象创建完之后都是类或者对象身上的普通属性(todo).
    // 他们之间的联系只是共同指向同一个对象的引用(内存地址)




  </script>
</body>
</html>
